﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using CRM.Objetos;

namespace CRM.CapaDatos
{
    public class DAOCanal
    {
        /// <summary>
        /// Nombre de la cadena de conexion en el archivo .config
        /// </summary>
        string cadenaConexion = string.Empty;

        /// <summary>
        /// Constructor de un objeto Canal
        /// </summary>
        /// <param name="cadena">Nombre de la cadena de conexion en el config</param>
        public DAOCanal(string cadena)
        {
            cadenaConexion = cadena;
        }

        /// <summary>
        /// Metodo para insertar un registro en la tabla canal de la base de datos
        /// </summary>
        /// <param name="can">Objeto Canal</param>
        /// <returns>Id del Canal recien insertado</returns>
        public int Crear(Canal can)
        {
            IDbConnection con = GenericProvider.CreateConnection(cadenaConexion);
            IDbCommand com = GenericProvider.CreateStoredProcedure(con, "CREAR_CANAL");

            IDbDataParameter nombre = GenericProvider.CreateParameter(com, "i_nombre", can.Nombre);
            IDbDataParameter medio = GenericProvider.CreateParameter(com, "i_medio", can.Medio);
            IDbDataParameter usu = GenericProvider.CreateParameter(com, "i_usu", can.Usu);
            IDbDataParameter bkp = GenericProvider.CreateParameter(com, "i_bkp", can.Bkp);

            com.Parameters.Add(nombre);
            com.Parameters.Add(medio);
            com.Parameters.Add(usu);
            com.Parameters.Add(bkp);

            con.Open();
            int retVal = (int)com.ExecuteScalar();
            con.Close();
            return retVal;
        }

        public void Editar(Canal can)
        {
            IDbConnection con = GenericProvider.CreateConnection(cadenaConexion);
            IDbCommand com = GenericProvider.CreateStoredProcedure(con, "EDITAR_CANAL");

            IDbDataParameter id = GenericProvider.CreateParameter(com, "i_canal", can.Id);
            IDbDataParameter nombre = GenericProvider.CreateParameter(com, "i_nombre", can.Nombre);
            IDbDataParameter medio = GenericProvider.CreateParameter(com, "i_medio", can.Medio);
            IDbDataParameter usu = GenericProvider.CreateParameter(com, "i_usu", can.Usu);
            IDbDataParameter bkp = GenericProvider.CreateParameter(com, "i_bkp", can.Bkp);

            com.Parameters.Add(id);
            com.Parameters.Add(nombre);
            com.Parameters.Add(medio);
            com.Parameters.Add(usu);
            com.Parameters.Add(bkp);

            con.Open();
            com.ExecuteNonQuery();
            con.Close();
        }

        /// <summary>
        /// Metodo que construye un objeto canal a partir de un cursor en base de datos
        /// </summary>
        /// <param name="drCanales">Cursor</param>
        /// <returns>Objeto canal</returns>
        private Canal Construir(IDataReader drCanales)
        {
            Canal can = new Canal();
            can.Id = drCanales.GetInt32(0);
            can.Nombre = drCanales.GetString(1);
            can.Medio = drCanales.GetInt32(2);
            can.usu = drCanales.GetInt32(3);
            can.Bkp = drCanales.GetInt32(4);            
            return can;
        }

        /// <summary>
        /// Metodo para consultar un canal en base de datos
        /// </summary>
        /// <returns>Canal</returns>
        public Canal Consultar(string idCanal)
        {
            IDbConnection con = GenericProvider.CreateConnection(cadenaConexion);
            IDbCommand com = GenericProvider.CreateStoredProcedure(con, "OBTENER_CANAL");
            IDbDataParameter id = GenericProvider.CreateParameter(com, "i_canal", idCanal);
            com.Parameters.Add(id);

            con.Open();
            IDataReader drCanales = com.ExecuteReader();
            Canal canal = new Canal();

            if (drCanales.Read())
            {
                canal=Construir(drCanales);
            }

            drCanales.Close();
            con.Close();
            return canal;
        }

        /// <summary>
        /// Metodo para listar los canales en base de datos
        /// </summary>
        /// <returns>Lista de Canales</returns>
        public List<Canal> Listar()
        {
            IDbConnection con = GenericProvider.CreateConnection(cadenaConexion);
            IDbCommand com = GenericProvider.CreateStoredProcedure(con, "LISTAR_CANALES");

            con.Open();
            IDataReader drCanales = com.ExecuteReader();
            List<Canal> listaCanales = new List<Canal>();

            while (drCanales.Read())
            {
                listaCanales.Add(Construir(drCanales));
            }

            drCanales.Close();
            con.Close();
            return listaCanales;
        }

        /// <summary>
        /// Metodo para eliminar un canal
        /// </summary>
        /// <param name="canal_id">Id del canal a eliminar</param>
        public void Eliminar(string canal_id)
        {
            IDbConnection con = GenericProvider.CreateConnection(cadenaConexion);
            IDbCommand com = GenericProvider.CreateStoredProcedure(con, "ELIMINAR_CANAL");

            IDbDataParameter id = GenericProvider.CreateParameter(com, "i_id", canal_id);
            com.Parameters.Add(id);

            con.Open();
            com.ExecuteNonQuery();
            con.Close();
        }

    }
}
